#include <Arduino.h>
#include <FastLED.h>

#define LED_PIN 21       // ESP32-C3的GPIO21引脚
#define NUM_LEDS 30      // LED灯珠数量
#define BRIGHTNESS 128   // LED亮度(0-255)，增加亮度使光剑更亮
#define LED_TYPE WS2812B // LED类型
#define COLOR_ORDER GRB  // 颜色顺序
#define btn 9            // ESP32-C3的BOOT按键引脚

CRGB leds[NUM_LEDS];         // 定义LED数组
bool isLightSaberOn = false; // 光剑状态
uint8_t currentLength = 0;   // 当前点亮的长度

void setup()
{
    delay(100); // 启动延迟

    // 初始化FastLED
    FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS)
        .setCorrection(TypicalLEDStrip);
    FastLED.setBrightness(BRIGHTNESS);

    // 设置BOOT按键为输入，启用内部上拉电阻
    pinMode(btn, INPUT_PULLUP);

    // 初始化所有LED为熄灭状态
    FastLED.clear();
    FastLED.show();
}

// 光剑开启动画（带加速效果）
void lightSaberOn()
{
    float delayTime = 50.0;   // 初始延时时间（较慢）
    float acceleration = 0.5; // 加速系数（小于1表示加速）

    // 从底部开始逐渐点亮，带加速效果
    for (int i = 0; i < NUM_LEDS; i++)
    {
        leds[i] = CRGB::Blue; // 蓝色光剑
        FastLED.show();

        // 计算当前延时时间（逐渐减少）
        delay(int(delayTime));
        delayTime *= acceleration;

        // 确保最小延时不小于2毫秒
        if (delayTime < 2)
        {
            delayTime = 2;
        }
    }

    // 全部点亮后的闪光效果
    FastLED.setBrightness(255);
    FastLED.show();
    delay(50);
    FastLED.setBrightness(BRIGHTNESS);
    FastLED.show();
}

// 光剑关闭动画（带减速效果）
void lightSaberOff()
{
    float delayTime = 2.0;    // 初始延时时间（较快）
    float deceleration = 1.2; // 减速系数（大于1表示减速）

    // 从顶部开始逐渐熄灭，带减速效果
    for (int i = NUM_LEDS - 1; i >= 0; i--)
    {
        leds[i] = CRGB::Black;
        FastLED.show();

        // 计算当前延时时间（逐渐增加）
        delay(int(delayTime));
        delayTime *= deceleration;

        // 限制最大延时不超过50毫秒
        if (delayTime > 50)
        {
            delayTime = 50;
        }
    }
}

void loop()
{
    // 检测BOOT按键
    if (digitalRead(btn) == LOW)
    {              // 按键按下
        delay(50); // 消抖
        if (digitalRead(btn) == LOW)
        {
            if (!isLightSaberOn)
            {
                lightSaberOn();
                isLightSaberOn = true;
            }
            else
            {
                lightSaberOff();
                isLightSaberOn = false;
            }
            // 等待按键释放
            while (digitalRead(btn) == LOW)
                ;
            delay(50); // 消抖
        }
    }

    // 如果光剑开启，添加呼吸效果
    if (isLightSaberOn)
    {
        static uint8_t brightness = BRIGHTNESS;
        static int8_t delta = 1;

        brightness += delta;
        if (brightness >= BRIGHTNESS + 20 || brightness <= BRIGHTNESS - 20)
        {
            delta = -delta;
        }

        FastLED.setBrightness(brightness);
        FastLED.show();
        delay(20);
    }
}
